﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OPTFleet.OPTFleet;

namespace OPTFleet.Data
{
    public class CamadaDados
    {
        public const int OP_LOGIN = 0;
        public const int OP_GETLISTCLIENTES = 1;
        public const int OP_GETLISTVEICULOS = 2;
        public const int OP_GETLISTSTOCK = 3;
        public const int OP_GETLISTFUNCIONARIOS = 4;
        public const int OP_GETLISTENCOMENDAS = 5;
        public const int OP_GETLISTPLANEAMENTOS = 6;

        public const int OP_CONSULTAR_CLIENTE = 50;
        public const int OP_CONSULTAR_ENCOMENDA = 51;
        public const int OP_CONSULTAR_FUNCIONARIO = 52;
        public const int OP_CONSULTAR_STOCK = 53;
        public const int OP_CONSULTAR_VEICULO = 54;
        public const int OP_CONSULTAR_PLANEAMENTO = 55;

        public const int OP_GET_MOTORISTAS_DISPONIVEIS = 100;
        public const int OP_GET_VEICULOS_ORD = 101;
        public const int OP_GET_ENCOMENDAS = 102;
        public const int OP_GET_TIPOS_VEICULOS = 103;
        public const int OP_GET_PLANEAMENTOS = 104;

        public const int OP_INSERIR_FUNCIONARIO = 151;
        public const int OP_UPDATE_FUNCIONARIO = 251;
        public const int OP_REMOVE_FUNCIONARIO = 351;

        public const int OP_INSERIR_VEICULO = 152;
        public const int OP_UPDATE_VEICULO = 252;
        public const int OP_REMOVE_VEICULO = 352;

        public const int OP_SET_PLANEAMENTOS = 200;

        public const int PLANEAMENTOS_CALCULADOS = 300;

        public enum permissao { Motorista, Gestor, Admin };

        private GestaoFuncionarios gestaoFuncionarios;
        private GestaoPlaneamentos gestaoPlaneamentos;
        private GestaoStock gestaoStock;
        private GestaoContas gestaoContas;
        private GestaoClientes gestaoClientes;
        private GestaoEncomendas gestaoEncomendas;
        private GestaoVeiculos gestaoVeiculos;

        public CamadaDados()
        {
            gestaoFuncionarios = new GestaoFuncionarios();
            gestaoStock = new GestaoStock();
            gestaoContas = new GestaoContas();
            gestaoClientes = new GestaoClientes();
            gestaoVeiculos = new GestaoVeiculos();
            gestaoEncomendas = new GestaoEncomendas(gestaoClientes);
            gestaoPlaneamentos = new GestaoPlaneamentos(gestaoVeiculos,gestaoFuncionarios,gestaoEncomendas);
        }

        public Object OperacaoDados(int idOp, Object[] dados)
        {
            switch (idOp)
            {
                case OP_LOGIN:
                    String tipo;
                    tipo = gestaoContas.VerificaConta((string) dados[0],(string) dados[1]);
                    if (tipo == null) return -1;
                    tipo = tipo.Trim();
                    switch (tipo)
                    {
                        case "Motorista":
                            return permissao.Motorista;
                        case "Gestor":
                            return permissao.Gestor;
                        case "Admin":
                            return permissao.Admin;
                        default:
                            return -1;
                    }
                case OP_GETLISTCLIENTES:
                    return gestaoClientes.GetListClientes();
                case OP_GETLISTVEICULOS:
                    return gestaoVeiculos.GetListVeiculos();
                case OP_GETLISTSTOCK:
                    return gestaoStock.GetListaStocks();
                case OP_GETLISTFUNCIONARIOS:
                    return gestaoFuncionarios.GetListFuncionarios();
                case OP_GETLISTENCOMENDAS:
                    return gestaoEncomendas.GetListEncomendas();
                case OP_GETLISTPLANEAMENTOS:
                    return gestaoPlaneamentos.GetListPlaneamentos();
                    

                case OP_CONSULTAR_CLIENTE:
                    int idcliente = (int)dados[0];
                    return gestaoClientes.ConsultarCliente(idcliente);
                case OP_CONSULTAR_ENCOMENDA:
                    int idencomenda = (int)dados[0];
                    return gestaoEncomendas.ConsultarEncomenda(idencomenda);
                case OP_CONSULTAR_FUNCIONARIO:
                    int idfuncionario = (int)dados[0];
                    return gestaoFuncionarios.ConsultarFuncionario(idfuncionario);
                case OP_CONSULTAR_STOCK:
                    int idproduto = (int)dados[0];
                    return gestaoStock.ConsultarStock(idproduto);
                case OP_CONSULTAR_VEICULO:
                    int idveiculo = (int)dados[0];
                    return gestaoVeiculos.ConsultarVeiculo(idveiculo);
                case OP_CONSULTAR_PLANEAMENTO:
                    int idf = (int)dados[0];
                    DateTime d = (DateTime)dados[1];
                    return gestaoPlaneamentos.ConsultarPlaneamento(idf,d);

                case OP_GET_TIPOS_VEICULOS:
                    return gestaoVeiculos.ConsultarTiposVeiculos();

                case OP_GET_MOTORISTAS_DISPONIVEIS:
                    return gestaoFuncionarios.GetMotoristasDisponiveis();
                case OP_GET_VEICULOS_ORD:
                    return gestaoVeiculos.GetVeiculosOrd();
                case OP_GET_ENCOMENDAS:
                    return gestaoEncomendas.GetEncomendaOrd((int)dados[0]);

                case OP_INSERIR_FUNCIONARIO:
                    Funcionario f = (Funcionario)dados[0];
                    gestaoFuncionarios.AdicionarFuncionario(f);
                    return null;
                case OP_UPDATE_FUNCIONARIO:
                    gestaoFuncionarios.AlterarFuncionario((Funcionario)dados[0]);
                    return null;
                case OP_REMOVE_FUNCIONARIO:
                    gestaoFuncionarios.RemoverFuncionario((Funcionario)dados[0]);
                    return null;

                case OP_INSERIR_VEICULO:
                    gestaoVeiculos.AdicionarVeiculo((Veiculo)dados[0]);
                    return null;
                case OP_UPDATE_VEICULO:
                    gestaoVeiculos.AlterarVeiculo((Veiculo)dados[0]);
                    return null;
                case OP_REMOVE_VEICULO:
                    gestaoVeiculos.RemoverVeiculo((int)dados[0]);
                    return null;

                case OP_SET_PLANEAMENTOS:
                    gestaoPlaneamentos.SetPlaneamentos((List<Planeamento>)dados[0]);
                    return null;

                case OP_GET_PLANEAMENTOS:
                    return gestaoPlaneamentos.ConsultarPlaneamentos((DateTime)dados[0]);
                case PLANEAMENTOS_CALCULADOS:
                    return gestaoPlaneamentos.PlaneamentosCalculados((DateTime)dados[0]);
                default:
                    break;
            }
            throw new Exception("Operacao invalida.");
        }
    }
}
